<?php

namespace Xibeicity\Message\Drivers;

use Xibeicity\Message\Contracts\MessageInterface;
use GuzzleHttp\Client;

class WechatRobot implements MessageInterface
{
    protected $webhook;
    protected $client;
    protected $error;

    /**
     * 初始化企业微信机器人驱动
     *
     * @param array $config 配置信息
     *                      - webhook 企业微信机器人Webhook地址
     */
    public function __construct(array $config)
    {
        $this->webhook = $config['webhook'];
        $this->client = new Client();
    }

    /**
     * 发送企业微信机器人消息
     *
     * @param array  $to      接收者（在企业微信机器人中实际未使用）
     * @param string $content 消息内容
     * @param array  $options 额外选项
     *                       - mentioned_list        需要@的成员ID列表
     *                       - mentioned_mobile_list 需要@的手机号码列表
     * 
     * @return array 发送结果
     *               - success    是否发送成功
     *               - message_id 消息ID
     */
    public function send(array $to, string $content, array $options = []): array
    {
        try {
            $message = [
                'msgtype' => 'text',
                'text' => ['content' => $content]
            ];

            if (!empty($options['mentioned_list'])) {
                $message['text']['mentioned_list'] = $options['mentioned_list'];
            }

            if (!empty($options['mentioned_mobile_list'])) {
                $message['text']['mentioned_mobile_list'] = $options['mentioned_mobile_list'];
            }

            $response = $this->client->post($this->webhook, [
                'json' => $message,
                'headers' => ['Content-Type' => 'application/json']
            ]);

            $result = json_decode($response->getBody()->getContents(), true);
            return [
                'success' => $result['errcode'] === 0,
                'message_id' => uniqid('robot_')
            ];
        } catch (\Exception $e) {
            $this->error = $e->getMessage();
            return [
                'success' => false,
                'message_id' => null
            ];
        }
    }

    /**
     * 使用模板发送企业微信机器人消息
     * 注意：企业微信机器人不支持模板消息，此方法会将模板转换为普通文本消息
     *
     * @param array  $to            接收者（在企业微信机器人中实际未使用）
     * @param string $templateCode  模板编码
     * @param array  $templateParams 模板参数
     * @param array  $options       额外选项
     * 
     * @return array 发送结果
     *               - success    是否发送成功
     *               - message_id 消息ID
     */
    public function sendTemplate(array $to, string $templateCode, array $templateParams = [], array $options = []): array
    {
        // 企业微信机器人不支持模板消息，转为普通消息发送
        $content = $templateCode . '\n';
        foreach ($templateParams as $key => $value) {
            $content .= $key . ': ' . $value . '\n';
        }
        return $this->send($to, $content, $options);
    }

    /**
     * 批量发送企业微信机器人消息
     *
     * @param array $messages 消息列表
     *                       - to      接收者
     *                       - content 消息内容
     *                       - options 额外选项
     * 
     * @return array 每条消息的发送结果数组
     */
    public function batchSend(array $messages): array
    {
        $results = [];
        foreach ($messages as $message) {
            $results[] = $this->send(
                $message['to'],
                $message['content'],
                $message['options'] ?? []
            );
        }
        return $results;
    }

    /**
     * 获取消息发送状态
     *
     * @param string|null $messageId 消息ID
     * 
     * @return array 发送状态
     *               - status 发送状态
     *               - error  错误信息
     */
    public function getStatus(string $messageId = null): array
    {
        return [
            'status' => 'sent',
            'error' => $this->error
        ];
    }

    /**
     * 获取错误信息
     *
     * @return string|null 错误信息
     */
    public function getError(): ?string
    {
        return $this->error;
    }

    /**
     * 获取驱动配置信息
     *
     * @return array 配置信息
     *               - webhook 企业微信机器人Webhook地址
     */
    public function getConfig(): array
    {
        return [
            'webhook' => $this->webhook
        ];
    }
}